/**
 * 实例内部类：
 * 在一个类中和成员变量与方法同级
 */

class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
    //实例内部类：你可以把他当做 是外部类的一个普通实例的成员
    class InnerClass {
        public int data1 = 999999;
        public int data4 = 4;
        private int data5 = 5;
        public static final int data6 = 6;//不能定义static成员变量
        public InnerClass() {
            System.out.println("不带参数的内部类的构造方法！");
        }
        //内部类的方法
        public void test() {
            //内外类有同名变量，打印哪个？
            System.out.println(OuterClass.this.data1);//打印外部类的
            System.out.println(this.data1);//打印内部类的
            System.out.println("InnerClass::test()");
        }
    }
    public void func1() {
        //static int a = 10; static属于类的，不属于对象的；但方法属于对象的
        System.out.println("OuterClass::func1()");
    }
}

public class TestDemo extends OuterClass.InnerClass {

    //如何继承一个内部类，如下要写一个构造方法
    public TestDemo(OuterClass out) {
        out.super();
    }

    //一个本地内部类，但是没啥用，只能在方法里用用
    public void func() {
        class Test {
            public int a;
        }
        //缺点：只能在当前方法当中使用
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.func1();
        //实例化一个内部类对象
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.test();
    }
}